// 默认结构体及其内部的成员变量都是私有的，不可变的
struct Point {
    x: i32,
    y: i32,
}


// 通过给结构体添加 pub 使其能够被导出并访问。使用给成员变量添加 pub 是变量能够在外部被初始化
// 如果不给成员变量添加 pub 外部无法访问这些成员变量，就更不要说初始化赋值了
pub struct UserInfo {
    pub user_id: i32,
    pub user_name: i32,
    pub age: i32,
    pub gender: bool,
    pub address: String,
}


pub struct Person {
    // 标量类型
    user_id: u32,
    first_name: String,      // 字符串类型
    last_name: String,
    age: u32,                // 无符号32位整数
    height: f64,             // 64位浮点数
    is_student: bool,        // 布尔类型

    // 复合类型
    address: (String, String), // 元组类型，包含街道和城市
    hobbies: Vec<String>,     // 向量类型，可以存储多个字符串
    scores: [u8; 3],          // 数组类型，固定大小的数组，这里是一个包含3个元素的u8数组

    // Option类型，用于表示可能存在或不存在的值
    favorite_color: Option<String>,

    // Result类型，用于表示成功或失败的操作结果
    last_test_result: Result<u32, String>,

    // 枚举类型，用于表示一组固定的可能值
    employment_status: EmploymentStatus,
}


// 枚举类型示例
#[derive(Debug)]
enum EmploymentStatus {
    Employed,
    Unemployed,
    Retired,
}

// 模块中的函数默认是私有的，只能在当前文件中使用。如果想要被外部引用，需要添加 pub 修饰以表明是公开类型
pub fn init_person() {

    let person = Person {
        user_id: 10000,
        first_name: String::from("John"),

        last_name: String::from("Doe"),

        age: 30,

        height: 1.80,

        is_student: false,

        address: (String::from("123 Main St"), String::from("Anytown")),

        hobbies: vec![String::from("Reading"), String::from("Swimming")],

        scores: [90, 85, 95],

        favorite_color: Some(String::from("Blue")),

        last_test_result: Ok(85),

        employment_status: EmploymentStatus::Employed,

    };


    println!("Person's data:");

    println!("First Name: {}", person.first_name);

    println!("Last Name: {}", person.last_name);

    println!("Age: {}", person.age);

    println!("Height: {}", person.height);

    println!("Is Student: {}", person.is_student);

    println!("Address: {}, {}", person.address.0, person.address.1);

    println!("Hobbies: {:?}", person.hobbies);

    println!("Scores: {:?}", person.scores);

    println!("Favorite Color: {:?}", person.favorite_color);

    println!("Last Test Result: {:?}", person.last_test_result);

    println!("Employment Status: {:?}", person.employment_status);

}